package com.xbongbong.parent.interfaces;

import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.pojo.dto.FormDataUpdateGetDTO;
import com.xbongbong.paas.pojo.vo.FormDataUpdateGetVO;
import com.xbongbong.paas.pojo.vo.ParseSingleRowDataVO;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.pro.formexplain.pojo.vo.HandlerExplainVO;
import com.xbongbong.pro.lowcodeconfig.pojo.dto.LowCodeConfigGetDTO;
import com.xbongbong.pro.lowcodeconfig.pojo.vo.LowCodeConfigGetVO;
import com.xbongbong.sys.domain.entity.UserEntity;

import java.util.List;
import java.util.Map;

/**
 * 该接口用于编辑页面渲染，将前端需要的字段信息处理并返回
 * @author 吴峰
 * @date 2022/01/17 11:14
 */
public interface BusinessEditPageRenderService<F, D> {

    /**
     * 该方法主要渲染编辑页面，需要实现如下接口
     * @param formDataUpdateGetDTO
     * @return
     * @author 吴峰
     * @date 2022/3/11 10:59
     * @throws XbbException
     */
    FormDataUpdateGetVO updateGet(FormDataUpdateGetDTO formDataUpdateGetDTO) throws XbbException;

    /**
     * 返回业务类型
     * @return
     */
    List<Integer> businessType();

    /**
     * 校验权限
     * @param formDataUpdateGetDTO
     * @throws XbbException
     */
    void validateEditPermission(FormDataUpdateGetDTO formDataUpdateGetDTO) throws XbbException;
    /**
     * 获取低代码配置
     * @param lowCodeConfigGetDTO
     * @return
     * @throws XbbException
     */
    LowCodeConfigGetVO getLowCodeConfig(LowCodeConfigGetDTO lowCodeConfigGetDTO) throws XbbException;
    /**
     * 获取数据
     * @param formDataUpdateGetDTO
     * @return
     * @throws XbbException
     */
    D getData(FormDataUpdateGetDTO formDataUpdateGetDTO) throws XbbException;


    /**
     * 校验是否在审批中
     * @param formDataUpdateGetDTO
     * @param dataEntity
     * @param formEntity
     * @throws XbbException
     */
    void isApprovedEdit(FormDataUpdateGetDTO formDataUpdateGetDTO, D dataEntity, F formEntity) throws XbbException;


    /**
     * 获取表单
     * @param formDataUpdateGetDTO
     * @return
     * @throws XbbException
     */
    F getForm(FormDataUpdateGetDTO formDataUpdateGetDTO) throws XbbException;

    /**
     * 获取字段解释
     * @param formEntity
     * @param corpid
     * @return
     * @throws XbbException
     */
    List<FieldAttrEntity> getExplain(F formEntity, String corpid) throws XbbException;

    /**
     * 处理字段解释，主要是处理可见，套餐等相关逻辑
     * @param formDataUpdateGetDTO
     * @param form
     * @param dataEntity
     * @param userMap
     * @param explainList
     * @return
     * @throws XbbException
     */
    HandlerExplainVO handleExplain(FormDataUpdateGetDTO formDataUpdateGetDTO, Map<String, UserEntity> userMap, D dataEntity, List<FieldAttrEntity> explainList, F form) throws XbbException;

    /**
     * 解析数据
     * @param formDataUpdateGetDTO
     * @param handlerExplainVO
     * @param dataEntity
     * @return
     * @throws XbbException
     */
    ParseSingleRowDataVO formatData(FormDataUpdateGetDTO formDataUpdateGetDTO, HandlerExplainVO handlerExplainVO, D dataEntity) throws XbbException;

    /**
     * 处理字段解释，主要是处理可见，套餐等相关逻辑
     * @param formDataUpdateGetDTO
     * @param list
     * @param form
     * @param dataEntity
     * @return
     * @throws XbbException
     */
    void businessHandleExplain(FormDataUpdateGetDTO formDataUpdateGetDTO, List<FieldAttrEntity> list, F form, D dataEntity) throws XbbException;
    /**
     * 特殊编辑页
     * ->重构于com.xbongbong.saas.help.ProDetailHandlerHelp#handelSaasSpecialUpdate(java.util.List, java.lang.Integer, com.xbongbong.paas.domain.entity.ext.PaasFormDataEntityExt, boolean, java.lang.Integer)
     * @param explainList
     * @param businessType
     * @param formDataEntityExt
     * @param distributorMark
     * @param formCopy
     * @throws XbbException
     */
    void handelSaasSpecialUpdate(List<FieldAttrEntity> explainList, Integer businessType, D formDataEntityExt, boolean formCopy, Integer distributorMark) throws XbbException;

    /**
     * saas特殊返回字段，放在一个对象中
     * @param formDataUpdateGetDTO
     * @param form
     * @param formDataUpdateGetVO
     * @param dataEntity 数据实体
     * @return
     * @throws XbbException
     */
    void formatSaasAttrToReturn(FormDataUpdateGetDTO formDataUpdateGetDTO, FormDataUpdateGetVO formDataUpdateGetVO, F form, D dataEntity) throws XbbException;
}
